ê³ ì°š íì íšì륌 ì¬ì©íì¬ ê³ êž ì ë€ëŠ íë¡ê·žëë° êž°ì ì ìŽíŽë³Žê³ , ê°ë ¥í ì¶ìí ë° íì ìì ìœë륌 구íí©ëë€.
ê³ êž ì ë€ëŠ íšíŽ: ê³ ì°š íì íšì
ì ë€ëŠ íë¡ê·žëë°ì ì¬ì©í멎 íì ìì ì±ì í¬ìíì§ ìê³ ë€ìí íì ìì ìëíë ìœë륌 ìì±í ì ììµëë€. Ʞ볞ì ìž ì ë€ëŠë ê°ë ¥íì§ë§, ê³ ì°š íì íšìë ëì± ë°ìŽë ííë ¥ì ë°ííì¬ ë³µì¡í íì ì¡°ì곌 ê°ë ¥í ì¶ìí륌 ê°ë¥íê² í©ëë€. ìŽ ëžë¡ê·ž ê²ì묌ììë ê³ ì°š íì íšìì ê°ë ì ììží ìŽíŽë³Žê³ , ê·ž êž°ë¥ê³Œ ì€ì ìì 륌 ì ê³µí©ëë€.
ê³ ì°š íì íšìë 묎ììžê°?
볞ì§ì ìŒë¡ ê³ ì°š íì íšìë ë€ë¥ž íì ì ìžìë¡ ë°ì ìë¡ìŽ íì ì ë°ííë íì ì ëë€. ê°ì ë€ë£šë íšì ëì íì ì ë€ë£šë íšìëŒê³ ìê°íììì€. ìŽë¬í êž°ë¥ì íµíŽ ë€ë¥ž íì ì ì¢ ìì ìž íì ì ì êµí ë°©ììŒë¡ ì ìíì¬ ë³Žë€ ì¬ì¬ì© ê°ë¥íê³ ì ì§ êŽëЬíêž° ì¬ìŽ ìœë륌 ë§ë€ ì ììµëë€. ìŽë ì ë€ëŠì Ʞ볞 ììŽëìŽë¥Œ êž°ë°ìŒë¡ íì§ë§ íì ë 벚ìì ìŽë£šìŽì§ëë€. ê°ë ¥íšì ì°ëŠ¬ê° ì ìíë ê·ì¹ì ë°ëŒ íì ì ë³ííë ë¥ë ¥ìì ë¹ë¡¯ë©ëë€.
ìŽê²ì ë ì ìŽíŽíêž° ìíŽ ìŒë°ì ìž ì ë€ëŠê³Œ ëì¡°íŽ ë³Žê² ìµëë€. ìŒë°ì ìž ì ë€ëŠ íì ì ë€ì곌 ê°ì ì ììµëë€ (TypeScript 구묞 ì¬ì©, ìŽë ìŽë¬í ê°ë ì ì 볎ì¬ì£Œë ê°ë ¥í íì ìì€í ì ê°ì§ ìžìŽìŽêž° ë묞ì ëë€).
interface Box<T> {
value: T;
}
ì¬êž°ì `Box<T>`ë ì ë€ëŠ íì ìŽê³ `T`ë íì ë§€ê°ë³ìì ëë€. `Box<number>` ëë `Box<string>`곌 ê°ìŽ ëªšë íì ì `Box`륌 ë§ë€ ì ììµëë€. ìŽê²ì 1ì°š ì ë€ëŠì ëë€ â 구첎ì ìž íì ì ì§ì ì ìŒë¡ ë€ë£¹ëë€. ê³ ì°š íì íšìë íì íšì륌 ë§€ê°ë³ìë¡ ë°ì í ëšê³ ë ëìê°ëë€.
ê³ ì°š íì íšì륌 ì¬ì©íë ìŽì ?
ê³ ì°š íì íšìë ë€ì곌 ê°ì ì¬ë¬ ê°ì§ ìŽì ì ì ê³µí©ëë€.
- ìœë ì¬ì¬ì©ì±: ë€ìí íì ì ì ì©í ì ìë ìŒë°ì ìž ë³íì ì ìíì¬ ìœë ì€ë³µì ì€ì ëë€.
- ì¶ìí: ë³µì¡í íì ë¡ì§ì ê°ëší ìží°íìŽì€ ë€ì ìšê²š ìœë륌 ë ìœê² ìŽíŽíê³ ì ì§ êŽëЬí ì ììµëë€.
- íì ìì ì±: 컎íìŒ ìì ì íì ì íì±ì 볎ì¥íì¬ ì€ë¥ë¥Œ ì¡°êž°ì ë°ê²¬íê³ ë°íì 묞ì 륌 ìë°©í©ëë€.
- ííë ¥: íì ê°ì ë³µì¡í êŽê³ë¥Œ 몚ëžë§íì¬ ëì± ì êµí íì ìì€í ì ê°ë¥íê² í©ëë€.
- êµ¬ì± ê°ë¥ì±: Ʞ졎 íì ì ê²°í©íì¬ ìë¡ìŽ íì íšì륌 ë§ë€ìŽ ë ê°ëší ë¶ë¶ìì ë³µì¡í ë³íì 구ì¶í©ëë€.
TypeScriptì ìì
ê³ êž íì ìì€í êž°ë¥ì íë¥íê² ì§ìíë ìžìŽìž TypeScript륌 ì¬ì©íì¬ ëª ê°ì§ ì€ì ìì 륌 ìŽíŽë³Žê² ìµëë€.
ìì 1: ìì±ì ìœêž° ì ì©ìŒë¡ ë§€í
Ʞ졎 íì ì 몚ë ìì±ìŽ `readonly`ë¡ íìë ì íì ì ë§ë€ê³ ì¶ë€ê³ ê°ì í©ëë€. ê³ ì°š íì íšìê° ììŒë©Ž ê° ìë íì ì ëíŽ ì íì ì ìëìŒë¡ ì ìíŽìŒ í ì ììµëë€. ê³ ì°š íì íšìë ì¬ì¬ì© ê°ë¥í ì룚ì ì ì ê³µí©ëë€.
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = Readonly<Person>; // ìŽì Personì 몚ë ìì±ì ìœêž° ì ì©ì
ëë€.
ìŽ ììì `Readonly<T>`ë ê³ ì°š íì íšìì ëë€. íì `T`륌 ì ë ¥ìŒë¡ ë°ì 몚ë ìì±ìŽ `readonly`ìž ì íì ì ë°íí©ëë€. ìŽê²ì TypeScriptì ë§€íë íì êž°ë¥ì ì¬ì©í©ëë€.
ìì 2: ì¡°ê±Žë¶ íì
ì¡°ê±Žë¶ íì ì ì¬ì©í멎 조걎ì ë°ëŒ ë¬ëŒì§ë íì ì ì ìí ì ììµëë€. ìŽê²ì ì°ëЬ íì ìì€í ì ííë ¥ì ëì± ìŠê°ìíµëë€.
type IsString<T> = T extends string ? true : false;
// ì¬ì©ë²
type Result1 = IsString<string>; // true
type Result2 = IsString<number>; // false
`IsString<T>`ë `T`ê° ë¬žììŽìžì§ íìží©ëë€. ê·žë ë€ë©Ž `true`륌 ë°íí©ëë€. ê·žë ì§ ììŒë©Ž `false`륌 ë°íí©ëë€. ìŽ íì ì íì ë 벚ìì íšì ìí ì íë©°, íì ì ê°ì žì ë¶ìž íì ì ìì±í©ëë€.
ìì 3: íšìì ë°í íì ì¶ì¶
TypeScriptë íšì íì ì ë°í íì ì ì¶ì¶íë `ReturnType<T>`ëŒë ëŽì¥ ì ížëŠ¬í° íì ì ì ê³µí©ëë€. ìë ë°©ì곌 ì ì¬í ê²ì (ê°ë ì ìŒë¡) ì ìíë ë°©ë²ì ìì ë³Žê² ìµëë€.
type MyReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
function greet(name: string): string {
return `Hello, ${name}!`;
}
type GreetReturnType = MyReturnType<typeof greet>; // string
ì¬êž°ì `MyReturnType<T>`ë `infer R`ì ì¬ì©íì¬ íšì íì `T`ì ë°í íì ì 캡ì²íì¬ ë°íí©ëë€. ìŽê²ì íšì íì ìì ìëíê³ ì 볎륌 ì¶ì¶íì¬ íì íšìì ê³ ì°šì í¹ì±ì ë€ì íë² ë³Žì¬ì€ëë€.
ìì 4: íì ë³ ê°ì²Ž ìì± íí°ë§
Ʞ졎 ê°ì²Ž íì ìì í¹ì íì ì ìì±ë§ í¬íšíë ì íì ì ë§ë€ê³ ì¶ë€ê³ ììíŽ ë³Žììì€. ìŽê²ì ë§€íë íì , ì¡°ê±Žë¶ íì ë° í€ ì¬ë§€íì ì¬ì©íì¬ ìí í ì ììµëë€.
type FilterByType<T, U> = {
[K in keyof T as T[K] extends U ? K : never]: T[K];
};
interface Example {
name: string;
age: number;
isValid: boolean;
}
type StringProperties = FilterByType<Example, string>; // { name: string }
ìŽ ììì `FilterByType<T, U>`ë ë ê°ì íì ë§€ê°ë³ì륌 ì¬ì©í©ëë€: `T` (íí°ë§í ê°ì²Ž íì )ì `U` (íí°ë§í íì ). ë§€íë íì ì `T`ì í€ë¥Œ ë°ë³µí©ëë€. ì¡°ê±Žë¶ íì `T[K] extends U ? K : never`ë í€ `K`ì ìì± íì ìŽ `U`륌 íì¥íëì§ íìží©ëë€. ê·žë ë€ë©Ž í€ `K`ê° ì ì§ë©ëë€. ê·žë ì§ ììŒë©Ž `never`ì ë§€íëìŽ ê²°ê³Œ íì ìì ìì±ì íšê³Œì ìŒë¡ ì ê±°í©ëë€. ê·žë° ë€ì íí°ë§ë ê°ì²Ž íì ìŽ ëëšžì§ ìì±ìŒë¡ 구ì±ë©ëë€. ìŽê²ì íì ìì€í ì ë³Žë€ ë³µì¡í ìíž ìì©ì 볎ì¬ì€ëë€.
ê³ êž ê°ë
íì ë 벚 íšì ë° ê³ì°
ì¡°ê±Žë¶ íì ë° ì¬ê·ì íì ë³ì¹ (ìŒë¶ ìžìŽìì ì¬ì© ê°ë¥)곌 ê°ì ê³ êž íì ìì€í êž°ë¥ì ì¬ì©í멎 íì ë 벚ìì ê³ì°ì ìí í ì ììµëë€. ìŽë¥Œ íµíŽ íì ìì ìëíë ë³µì¡í ë¡ì§ì ì ìíì¬ íì ë 벚 íë¡ê·žëšì íšê³Œì ìŒë¡ ë§ë€ ì ììµëë€. ê° ë 벚 íë¡ê·žëšì ë¹íŽ ê³ì°ì ìŒë¡ ì íì ìŽì§ë§ íì ë 벚 ê³ì°ì ë³µì¡í ë¶ë³ì±ì ì ì©íê³ ì êµí íì ë³íì ìííë ë° ì ì© í ì ììµëë€.
Variadic ì¢ ë¥ ìì
ìŒë¶ íì ìì€í , í¹í Haskellì ìí¥ìë°ì ìžìŽë variadic ì¢ ë¥ (ê³ ì°š ì¢ ë¥ íì ìŽëŒê³ ë íš)륌 ì§ìí©ëë€. ìŠ, íì ìì±ì (ì: `Box`) ì첎ë íì ìì±ì륌 ìžìë¡ ì¬ì©í ì ììµëë€. ìŽê²ì í¹í íšìí íë¡ê·žëë° ì»ší ì€ížìì íšì¬ ë ê³ êž ì¶ìí ê°ë¥ì±ì ìŽìŽì€ëë€. Scalaì ê°ì ìžìŽë ìŽë¬í êž°ë¥ì ì ê³µí©ëë€.
ì ì ê³ ë € ì¬í
ê³ êž íì ìì€í êž°ë¥ì ì¬ì©í ëë ë€ì ì¬íì ê³ ë €íë ê²ìŽ ì€ìí©ëë€.
- ë³µì¡ì±: ê³ êž êž°ë¥ì 곌ëíê² ì¬ì©í멎 ìœë륌 ìŽíŽíê³ ì ì§ êŽëЬíêž°ê° ë ìŽë €ìì§ ì ììµëë€. ííë ¥ê³Œ ê°ë ì± ì¬ìŽì ê· íì ì ì§íììì€.
- ìžìŽ ì§ì: 몚ë ìžìŽê° ê³ êž íì ìì€í êž°ë¥ì ëìŒí ìì€ìŒë¡ ì§ìíì§ë ììµëë€. ì구 ì¬íì 충족íë ìžìŽë¥Œ ì ííììì€.
- í ì 묞ì±: íìŽ ê³ êž íì ìì€í êž°ë¥ì ì¬ì©íë ìœë륌 ì¬ì©íê³ ì ì§ êŽëЬíë ë° íìí ì 묞ì±ì ê°ì¶ê³ ìëì§ íìžíììì€. êµì¡ ë° ë©í ë§ìŽ íìí ì ììµëë€.
- 컎íìŒ ìê° ì±ë¥: ë³µì¡í íì ê³ì°ì 컎íìŒ ìê°ì ë늎 ì ììµëë€. ì±ë¥ì 믞ì¹ë ìí¥ì ì ìíììì€.
- ì€ë¥ ë©ìì§: ë³µì¡í íì ì€ë¥ë íŽë íêž° ìŽë €ìž ì ììµëë€. íì ì€ë¥ë¥Œ íšê³Œì ìŒë¡ ìŽíŽíê³ ëë²ê·žíë ë° ëììŽëë ë구ì êž°ì ì í¬ìíììì€.
ìµê³ ì ë°©ë²
- íì ì 묞ìííììì€: íì íšìì 목ì 곌 ì¬ì©ë²ì ëª ííê² ì€ëª íììì€.
- ì믞ìë ìŽëŠì ì¬ì©íììì€: íì ë§€ê°ë³ì ë° íì ë³ì¹ì ëíŽ ì€ëª ì ìž ìŽëŠì ì ííììì€.
- ê°ëšíê² ì ì§íììì€: ë¶íìí ë³µì¡ì±ì íŒíììì€.
- íì ì í ì€ížíììì€: íì íšìê° ììëë¡ ìëíëì§ íìžíêž° ìíŽ ëšì í ì€ížë¥Œ ìì±íììì€.
- ëŠ°í° ë° íì ê²ì¬êž°ë¥Œ ì¬ì©íììì€: ìœë© íì€ì ì ì©íê³ íì ì€ë¥ë¥Œ ì¡°êž°ì ì¡ìŒììì€.
ê²°ë¡
ê³ ì°š íì íšìë íì ìì íê³ ì¬ì¬ì© ê°ë¥í ìœë륌 ìì±íë ê°ë ¥í ë구ì ëë€. ìŽë¬í ê³ êž êž°ì ì ìŽíŽíê³ ì ì©íšìŒë¡ìš ëì± ê°ë ¥íê³ ì ì§ êŽëЬíêž° ì¬ìŽ ìíížìšìŽë¥Œ ë§ë€ ì ììµëë€. ë³µì¡ì±ì ì ë°í ì ìì§ë§ ìœë ëª íì± ë° ì€ë¥ ë°©ì§ ìž¡ë©Žìì ì»ë ìŽì ìŽ ë¹ì©ë³Žë€ í° ê²œì°ê° ë§ìµëë€. íì ìì€í ìŽ ê³ì ì§ííšì ë°ëŒ ê³ ì°š íì íšìë ìíížìšìŽ ê°ë°, í¹í TypeScript, Scala ë° Haskell곌 ê°ìŽ ê°ë ¥í íì ìì€í ì ê°ì¶ ìžìŽìì ì ì ë ì€ìí ìí ì í ê²ì ëë€. íë¡ì ížìì ìŽë¬í ê°ë ì ì€ííì¬ ì ì¬ë ¥ì ìµëí íì©íììì€. ê³ êž êž°ë¥ì ì¬ì©íëëŒë ìœë ê°ë ì± ë° ì ì§ êŽëЬ ê°ë¥ì±ì ì°ì ìíììì€.